//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with this program.  If not, see http://www.gnu.org/licenses/.
// 

namespace peermaliziosi;

// superclasse comune per tutti i messaggi del protocollo BitTorrent
packet BitTorrentMsg
{
    int source;
    int destination;
    // lunghezza del messaggio in byte
    int btPayloadLength;
}

// NOTA BENE: Handshake e Piece hanno lunghezza variabile


// The cancel message is fixed length, and is used to cancel block requests. The
// payload is identical to that of the "request" message. It is typically used 
// during "End Game".
packet Cancel extends BitTorrentMsg
{
    // integer specifying the zero-based piece index
    int pieceIndex;
    // integer specifying the zero-based byte offset within the piece
    int blockIndex;
    btPayloadLength= 3;   
}


packet Handshake extends BitTorrentMsg
{
    int peerID;
    bool bitfield[];
    bool iKnowYou; // false se il peer che ha inviato Handshake vuole che il peer che lo riceve gli mandi il suo handshake
    btPayloadLength= 1; // + lunghezza bitfield
}

// per l'algoritmo di choking/unchoking
packet Choke extends BitTorrentMsg
{
    btPayloadLength= 1;
}

// per l'algoritmo di choking/unchoking
packet Unchoke extends BitTorrentMsg
{
    btPayloadLength= 1;
}

// Notifica di acquisizione di un nuovo pezzo. Inviato a tutti i peer nel peer set di un peer.
// The payload is the zero-based index of a piece that has just been successfully 
// downloaded and verified via the hash. 
packet Have extends BitTorrentMsg
{
    // integer specifying the zero-based piece index
    int pieceIndex;
    btPayloadLength= 5;
}

// il peer mittente e' interessato al peer destinatario
// un peer A e' interessato al peer B quando B possiede dei pezzi che A non possiede
// un peer A non e' interessato al peer B quando B possiede un sottoinsieme dei pezzi di A
packet Interested extends BitTorrentMsg
{
    btPayloadLength= 1;
}

packet KeepAlive extends BitTorrentMsg
{
    btPayloadLength= 1;
}

// il peer mittente e' NON interessato al peer destinatario
// un peer A e' interessato al peer B quando B possiede dei pezzi che A non possiede
// un peer A non e' interessato al peer B quando B possiede un sottoinsieme dei pezzi di A
packet NotInterested extends BitTorrentMsg
{
    btPayloadLength= 1;
}

packet Piece extends BitTorrentMsg
{
    // integer specifying the zero-based piece index
    int pieceIndex;
    // integer specifying the zero-based byte offset within the piece
    int blockIndex;
    // ci sarebbe anche la parte dati del file ma siccome non la usiamo nella simulazione e' omessa
    btPayloadLength= 9; // + lunghezza del blocco  
}

packet Request extends BitTorrentMsg
{
    // integer specifying the zero-based piece index
    int pieceIndex;
    // integer specifying the zero-based byte offset within the piece
    int blockIndex; //numero di blocco all'interno del pezzo
    btPayloadLength= 13;
}

